package com.tanhua.server.service;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.tanhua.commons.key.RedisKeyConst;
import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mg.Visitor;
import com.tanhua.domain.vo.VisitorVo;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.mg.VisitorsApi;
import com.tanhua.server.utils.ThreadLocalUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.SynchronousQueue;

@Service
public class VisitorsService {
    //订阅VisitorsApi
    @Reference
    private VisitorsApi visitorsApi;
    //订阅UserInfoApi
    @Reference
    private UserInfoApi userInfoApi;
    //注入ThreadLocalUtils对象
    @Autowired
    private ThreadLocalUtils threadLocalUtils;
    //注入redisTemplate对象
    @Autowired
    private RedisTemplate<String,String> redisTemplate;



    /**
     * 谁看过我
     * @return
     */
    public List<VisitorVo> queryVisitors() {
        //a.获取当前用户id
        Long currentUserId = threadLocalUtils.getUserId();
        //b.定义一个记录登录时间的key visitors_time_+当前用户id
        String key= RedisKeyConst.VISITOR_TIME+currentUserId;
        //c.从redis中获取key键的值
        String lastVisitTimeValue = redisTemplate.opsForValue().get(key);
        long lastTime=0;
        if (StringUtils.isNotEmpty(lastVisitTimeValue)){
            //转换时间格式
            lastTime  = Long.parseLong(lastVisitTimeValue);
        }
        //d.如果键不存在 说明没有上次登录时间
        //那么就调用VisitorsApi 传入当前用户id 返回List<Visitor>
        List<Visitor> visitorList=null;
        if(StringUtils.isEmpty(lastVisitTimeValue)){
            visitorList = visitorsApi.queryRecentVisitorRecordsIfNull(currentUserId);
        }
        //e.如果存在 那么调用api 传入当前用户和上次的登录时间 返回List<Visitors>
        else {
            visitorList = visitorsApi.queryRecentVisitorRecords(currentUserId,lastTime);
        }
        //创建集合 存储VisitorVo
        List<VisitorVo> visitorVoList=new ArrayList<>();
        //如果集合不为空 那么就遍历这个集合
        if(!CollectionUtils.isEmpty(visitorList)){
            for (Visitor visitor : visitorList) {
                VisitorVo visitorVo = new VisitorVo();
                //获取visitor的访客id
                Integer visitorUserId = visitor.getVisitorUserId();
                //根据访客id查询用户信息表
                UserInfo userInfo = userInfoApi.findUserInfoByID(Long.valueOf(visitorUserId));
                //将userInfo属性封装到visitorVo
                BeanUtils.copyProperties(userInfo,visitorVo);
                //单独设置属性
                visitorVo.setId(userInfo.getId().intValue());//访客用户id
                visitorVo.setTags(userInfo.getTags().split(","));//标签信息
                //判断visitor.getScore是否为null
                if(visitor.getScore()==null){
                    visitor.setScore(Math.random()*100.0);
                }
                visitorVo.setFateValue(visitor.getScore().intValue());//设置缘分值
                //添加到vo集合
                visitorVoList.add(visitorVo);
            }
        }
        //f.记录当前时间到redis中
        redisTemplate.opsForValue().set(key, System.currentTimeMillis()+"");
        //返回集合数据
        return visitorVoList;

    }
}
